﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

/*
 Onceki orneklerden farkli olarak,
 * Test ettigimiz nesne kontrol edemedigimiz
 * nesnelere bagliysa ve test isleminde bunun
 * ne dondurecegini bilmedigimizde nasil
 * bir test teknigi uygulamamiz gerekir. Sonucta nesnenin bir dependency si vardir, 
 * mesela bunlar, threading,webservice,time of day,file system.
 * Bu yuzden STUBS lar kullanilir.
 * 
 
 * 
 * EXTERNAL DEPENDENCY: (Dışsal bağımlılık)
 Bu sisteminizdeki bir nesnedir ve test ettiginiz kodla butunlesir yada birbirine gereksinim duyar ve bu nesnede sizin herhangi bir kontrolunuz yoktur mesela, filesystem,threads,memory,time gibi. Dolayisiyla bunlar icin STUBS lar kullanilir.
 * 
 * STUBS:
 Var olan bir dependency kontrol etmeye yarar. Stubslari kullanarak dependency ile direk olarak ilgilenmek yerine kodu stubs lar uzerinden test edebilirsiniz.
 TEST PATTERN NAMES: (xUnit Test Patterns by Gerard Meszaros)
 * Bu durumlar icin cesitli test patternleri vardir bunlar testlerde fake kullanmamizi saglar bizim ilgilendigimiz:
 1-FAKES,
 2-STUBS,
 3-MOCKS.
 
 * 
 
 Bu Ornekte diyelimki; LogAnalyzer sinifi birden cok dosya ismi uzantisini ozel bir adapter kullanarak kontrol edebilmesi konfigure edilebilir olsun. Farzedelim bu izin verilen dosya isimleri diskin bir yerinde bir configuration setting olarak bulunmus olsun.Yani
 
public bool IsValidLogFileName(string fileName)
{
//read through the configuration file
//return true if configuration says extension is supported.
}
 Burada gorecez ki test bir filesyteme bagli cunku kodda external bir dependency ile iliskili.

 REFACTORING:
 Kodun işlevselligin bozmadan dizaynın değiştirebilmesine refactoring denir.

 SEAMS:
 Stub sınıfları gibi farklı fonksiyonellikleri ekleyebilecegimiz koddaki alanlara denir.
 * 
 * 
 * 
 AMACIMIZ: Yazdıgımız kodun teste edilebilir olmasını sağlamak. bundan dolayı dependencyi kesmemiz gerekir ki kod test edilebilir olsun.Cesitli design patterns, refactoring teknikler ve seams ler gereklidir. Sonucta dependencyi engellememiz için belli teknikler kullanılır. Bu chapterın amacıda bunu gostermektir.
 ❂ Extract an interface to allow replacing underlying implementation. (Teknik 1)
 ❂ Inject stub implementation into a class under test.
 ❂ Receive an interface at the constructor level.
 ❂ Receive an interface as a property get or set.
 ❂ Get a stub just before a method call.
 * 
 */
namespace LogAnProject2
{
    //Bu teknikte dosya sistemine dokunan kodu ayırmamız gerekir.
    class LogAnalyzerTeknik1
    {

        //Extracting a class that touches the filesystem, and calling it
        public bool IsValidLogFileName(string fileName)
        {
            IExtensionManager mgr =new FileExtensionManager();     
            return mgr.IsValid(fileName);
        }
    }
    class FileExtensionManager : IExtensionManager
    {
        //public bool IsValid(string fileName)
        //{
        //    //return true;
        //}
       
    }
    public interface IExtensionManager
    {
        bool IsValid(string fileName);
    }


}
